/*-------------------------------------------------------------------------
 *
 * pg_shdepend.h
 *	  "共享依赖" 系统目录 (pg_shdepend) 的定义
 *
 * pg_shdepend 没有预加载内容，因此没有 pg_shdepend.dat 文件；系统定义对象的依赖关系
 * 在 initdb 期间动态加载。大多数内置对象都会被固定，因此在 pg_shdepend 中
 * 不需要显式条目。
 *
 * 注意：我们并不表示 pg_shdepend 中所有可能的依赖关系对；
 * 例如，从关系到其数据库的显式依赖关系没有太大价值。目前，仅角色的依赖关系
 * 明确存储在 pg_shdepend 中。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_shdepend.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_SHDEPEND_H
#define PG_SHDEPEND_H

#include "catalog/genbki.h"
#include "catalog/pg_shdepend_d.h"

/* ----------------
 *		pg_shdepend 定义。 cpp 将其转换为
 *		typedef struct FormData_pg_shdepend
 * ----------------
 */
CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION
{
	/*
	 * 依赖（引用）对象的标识。
	 *
	 * 请注意，dbid 可以为零以表示共享对象。
	 */
	Oid			dbid BKI_LOOKUP_OPT(pg_database);	/* 包含对象的数据库的 OID */
	Oid			classid BKI_LOOKUP(pg_class);	/* 包含对象的表的 OID */
	Oid			objid;			/* 对象本身的 OID */
	int32		objsubid;		/* 列号，或 0 如果未使用 */

	/*
	 * 独立（被引用）对象的标识。这总是一个
	 * 共享对象，因此我们不需要数据库 ID 字段。我们也不在乎
	 * 子对象 ID。
	 */
	Oid			refclassid BKI_LOOKUP(pg_class);	/* 包含对象的表的 OID */
	Oid			refobjid;		/* 对象本身的 OID */

	/*
	 * 关系的精确定义由 deptype 字段指定。
	 * 参见 catalog/dependency.h 中的 SharedDependencyType。
	 */
	char		deptype;		/* 参见 dependency.h 中的代码 */
} FormData_pg_shdepend;

/* ----------------
 *		Form_pg_shdepend 对应一个指向行的指针，其格式为
 *		pg_shdepend 关系。
 * ----------------
 */
typedef FormData_pg_shdepend *Form_pg_shdepend;

DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));
DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops));

#endif							/* PG_SHDEPEND_H */
